import Spec from 'pactum/src/models/Spec'
import * as pactum from 'pactum'

describe('Auth登录认证-e2e测试', () => {
  let spec: Spec
  const user = {
    username: '挽梦忆笙歌001',
    password: '123456'
  }

  beforeEach(() => {
    spec = global.spec as Spec
  })
  // 用户注册
  it('用户注册', () => {
    return spec
      .post('/api/v1/auth/signup')
      .withBody(user)
      .expectStatus(201)
      .expectBodyContains(user.username)
  })
  // 用户使用相同的用户名再次注册
  it('用户名重复', async () => {
    // 先注册一遍:一个spec只能发起一个请求,如果需要发起多个请求就需要注册多个spec实例
    await (global.pactum as typeof pactum).spec().post('/api/v1/auth/signup').withBody(user)
    // 如果使用下面的将报重复请求
    // await spec.post('/api/v1/auth/signup').withBody(user)
    // 在注册一遍
    return spec
      .post('/api/v1/auth/signup')
      .withBody(user)
      .expectStatus(403)
      .expectBodyContains('用户已存在')
  })
  // 用户注册传参异常 username，password -> 长度,类型，控制
  it('用户注册传参异常', () => {
    const user1 = {
      ...user,
      username: '挽梦忆笙歌'
    }
    return spec
      .post('/api/v1/auth/signup')
      .withBody(user1)
      .expectStatus(500)
      .expectBodyContains('Internal server error')
  })
  // 用户登录
  it('用户登录', async () => {
    // 先注册再登录
    await (global.pactum as typeof pactum).spec().post('/api/v1/auth/signup').withBody(user)
    return spec
      .post('/api/v1/auth/signin')
      .withBody(user)
      .expectStatus(201)
      .expectBodyContains('access_token')
  })
  // 用户不存在
  it('用户登录-用户不存在', () => {
    // 不注册直接登录
    return spec
      .post('/api/v1/auth/signin')
      .withBody(user)
      .expectStatus(403)
      .expectBodyContains('用户不存在，请注册')
  })
  // 用户的账号或密码错误
  it('用户的账号或密码错误', async () => {
    const user1 = {
      ...user,
      password: '12345678'
    }
    // 先注册再登录
    await (global.pactum as typeof pactum).spec().post('/api/v1/auth/signup').withBody(user)
    return spec
      .post('/api/v1/auth/signin')
      .withBody(user1)
      .expectStatus(403)
      .expectBodyContains('用户名或密码错误')
  })
  // 用户登录传参异常 username,password -> 长度,类型,控制
  it('用户登录传参异常', async () => {
    const user1 = {
      ...user,
      password: '12345'
    }
    // 先注册再登录
    await (global.pactum as typeof pactum).spec().post('/api/v1/auth/signup').withBody(user)
    return spec
      .post('/api/v1/auth/signin')
      .withBody(user1)
      .expectStatus(500)
      .expectBodyContains('Internal server error')
  })
  /* 补充说明：
  user模块 -> hraders -> token信息 -> beforeEch -> 获取token */
})
